#include "zhi.h"
//fnv-1a算法。以str为起始，长度为length的字符串的哈希值。
uint32_t 计算字符串哈希值(char* str, uint32_t 长度) {
   uint32_t hashCode = 2166136261, idx = 0;
   while (idx < 长度) {
      hashCode ^= str[idx];
      hashCode *= 16777619;
      idx++;
   }
   return hashCode;
}

//为string计算哈希码并将值存储到string->hash
void 为字符串计算哈希值并将值存储(字符串对象S* objZiFuChuan) {
   objZiFuChuan->hashCode = 
      计算字符串哈希值(objZiFuChuan->value.start, objZiFuChuan->value.长度);
}

//以str字符串创建ObjZiFuChuan对象,允许空串""
字符串对象S* 以字符串创建字符串对象(虚拟机* 虚拟机S, const char* str, uint32_t 长度) {
   //length为0时str必为NULL length不为0时str不为NULL
   ASSERT(长度 == 0 || str != NULL, "str 长度 don`t match str!");

   //+1是为了结尾的'\0'
   字符串对象S* objZiFuChuan = 分配除主类型外还需要额外指定大小的内存M(虚拟机S, 字符串对象S, 长度 + 1);

   if (objZiFuChuan != NULL) {
      初始化对象头(虚拟机S, &objZiFuChuan->objHeader, 对象类型_字符串, 虚拟机S->stringClass);
      objZiFuChuan->value.长度 = 长度;

      //支持空字符串: str为null,length为0
      //如果非空则复制其内容
      if (长度 > 0) {
	 memcpy(objZiFuChuan->value.start, str, 长度);
      }
      objZiFuChuan->value.start[长度] = '\0';
      为字符串计算哈希值并将值存储(objZiFuChuan);
   } else {
      内存分配_错误("Allocating 字符串对象S failed!");
   }
   return objZiFuChuan;
}
